package main;

import java.util.Date;

import fumec.br.ia.algoritmo.AStarSearch;
import fumec.br.ia.algoritmo.BFSearch;
import fumec.br.ia.algoritmo.DFSearch;
import fumec.br.ia.search.FifoFranja;
import fumec.br.ia.search.IFranja;
import fumec.br.ia.search.LifoFranja;
import fumec.br.ia.search.Problema;
import fumec.br.ia.search.QueueFranja;
import fumec.br.ia.search.Solucao;


public class Main {
	public static void main(String[] args) throws Exception {
		Problema problema = null;
		IFranja franja = null;
		Date inicio = null;
		Date fim = null;
		Solucao solucao = null;
		AStarSearch aStarSearch = null;
		BFSearch bfSearch = null;
		DFSearch dfSearch = null;

		
		/*************************BFSearch(31, 54)************************************/
		problema = new Problema("distance.csv");
		franja = (IFranja) new FifoFranja();
		problema.setOrigem(31);
		problema.setDestino(54);
		bfSearch = new BFSearch();
		inicio = new Date();
		solucao = bfSearch.buscaEmArvore(problema, franja);
		System.out.println("Algoritmo: BFSearch(31, 54)");
		System.out.println("Caminho: "+problema.getOrigem()+","+solucao.toString());
		System.out.println("Custo: "+solucao.custo());
		fim = new Date();
		System.out.println("Tempo: "+ (fim.getTime()-inicio.getTime()) + " milissegundos");
		System.out.println("\n\n");
		
		
		
		
		/*************************BFSearch(47, 16)************************************/
		/*
		problema = new Problema("distance.csv");
		problema.setOrigem(47);
		problema.setDestino(16);
		franja = (IFranja) new FifoFranja();
		inicio = new Date();
		bfSearch = new BFSearch();
		solucao = bfSearch.buscaEmArvore(problema, franja);
		System.out.println("Algoritmo: BFSearch(47, 16)");
		System.out.println("Caminho: "+problema.getOrigem()+","+solucao.toString());
		System.out.println("Custo: "+solucao.custo());
		fim = new Date();
		System.out.println("Tempo: "+ (fim.getTime()-inicio.getTime()) + " milissegundos");
		System.out.println("\n\n");
		*/
		
		
		
		
		
		
		/*************************DFSearch(31, 54)************************************/
		problema = new Problema("distance.csv");
		problema.setOrigem(31);
		problema.setDestino(54);
		franja = (IFranja) new LifoFranja();
		
		dfSearch = new DFSearch();
		inicio = new Date();
		solucao = dfSearch.buscaEmGrafo(problema, franja);
		System.out.println("Algoritmo: DFSearch(31, 54)");
		System.out.println("Caminho: "+problema.getOrigem()+","+solucao.toString());
		System.out.println("Custo: "+solucao.custo());
		fim = new Date();
		System.out.println("Tempo: "+ (fim.getTime()-inicio.getTime()) + " milissegundos");
		System.out.println("\n\n");
		
		
		
		
		
		
		/*************************DFSearch(47, 16)************************************/
		problema = new Problema("distance.csv");
		problema.setOrigem(47);
		problema.setDestino(16);
		franja = (IFranja) new LifoFranja();
		
		dfSearch = new DFSearch();
		inicio = new Date();
		solucao = dfSearch.buscaEmGrafo(problema, franja);
		System.out.println("Algoritmo: DFSearch(47, 16)");
		System.out.println("Caminho: "+problema.getOrigem()+","+solucao.toString());
		System.out.println("Custo: "+solucao.custo());
		fim = new Date();
		System.out.println("Tempo: "+ (fim.getTime()-inicio.getTime()) + " milissegundos");
		System.out.println("\n\n");
		
		
		
		
		
		/*************************AStarSearch(31, 54)************************************/
		problema = new Problema("distance.csv", "sldistance.csv");
		problema.setOrigem(31);
		problema.setDestino(54);
		aStarSearch = new AStarSearch();
		franja = (IFranja) new QueueFranja();
		inicio = new Date();
		solucao = aStarSearch.buscaEmGrafo(problema, franja);
		System.out.println("Algoritmo: AStarSearch(31, 54)");
		System.out.println("Caminho: "+problema.getOrigem()+","+solucao.toString());
		System.out.println("Custo: "+solucao.custo());
		fim = new Date();
		System.out.println("Tempo: "+ (fim.getTime()-inicio.getTime()) + " milissegundos");
		System.out.println("\n\n");
		
		
		
		
		
		/*************************AStarSearch(47, 16)************************************/
		problema = new Problema("distance.csv", "sldistance.csv");
		problema.setOrigem(47);
		problema.setDestino(16);
		
		aStarSearch = new AStarSearch();
		franja = (IFranja) new QueueFranja();
		inicio = new Date();
		solucao = aStarSearch.buscaEmGrafo(problema, franja);
		System.out.println("Algoritmo: AStarSearch(47, 16)");
		System.out.println("Caminho: "+problema.getOrigem()+","+solucao.toString());
		System.out.println("Custo: "+solucao.custo());
		fim = new Date();
		System.out.println("Tempo: "+ (fim.getTime()-inicio.getTime()) + " milissegundos");
	}
}